package com.chenwut.myreflect.a02_reflect_constructor;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author ChenPi
 * @since 2024/09/23 16:07
 */
public class MyReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        /**
         * Constructor<?>[] getConstructors()                                       返回所有公共构造方法对象的数组
         * Constructor<?>[] getDeclaredConstructors()                               返回所有构造方法对象的数组
         * Constructor<T>[] getConstructor(Class<?>.parameterTypes)                 返回单个公共构造方法对象
         * Constructor<T>[] getDeclaredConstructor(Class<?>... parameterTypes)      返回单个构造方法对象
         *
         * Constructor类中用于创建对象的方法
         * T newlnstance(Object... initargs)                                         根据指定的构造方法创建对象
         * setAccessible(boolean flag)                                              设置为true,表示取消访问检查
         *
         * getDeclaredXXX 只是能看到非公共的构造方法，但是不能直接使用
         * 需要结合 setAccessible
         */

        // 1. 获取class字节码文件对象
        Class clazz = Class.forName("com.chenwut.myreflect.a02_reflect_constructor.Student");

        // 2. 获取构造方法

        // // 2.1 获取所有公共构造方法
        // Constructor[] cons = clazz.getConstructors();
        // for (Constructor con : cons) {
        //     System.out.println(con);
        // }

        // // 2.2 获取所有构造方法
        // Constructor[] cons1 = clazz.getDeclaredConstructors();
        // for (Constructor con : cons1) {
        //     System.out.println(con);
        // }

        // // 2.3 获取单个公共构造方法
        // Constructor con = clazz.getConstructor(String.class);
        // System.out.println(con);

        // // 2.4 获取单个构造方法
        // Constructor con1 = clazz.getDeclaredConstructor();
        // System.out.println(con1);
        //
        // Constructor con2 = clazz.getDeclaredConstructor(int.class);
        // System.out.println(con2);
        //
        // Constructor con3 = clazz.getDeclaredConstructor(String.class);
        // System.out.println(con3);

        Constructor con4 = clazz.getDeclaredConstructor(String.class, int.class);

        // // 获取构造方法的访问权限修饰符
        // int modifiers = con4.getModifiers();
        // System.out.println(modifiers);
        //
        // // 获取构造方法的参数
        // Class[] parameterTypes = con4.getParameterTypes();
        // for (Class parameterType : parameterTypes) {
        //     System.out.println(parameterType);
        // }
        // int count = con4.getParameterCount();
        // System.out.println(count);

        // 暴力反射：临时取消权限校验
        con4.setAccessible(true);

        Student stu = (Student) con4.newInstance("chenpi", 18);
        System.out.println(stu);
    }
}
